package org.cnam.mobileShopping.dao;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.cnam.mobileShopping.bean.Category;
import org.cnam.mobileShopping.bean.Product;
import org.cnam.mobileShopping.sql.DbAdapter;
import org.cnam.mobileShopping.wsclient.WSClient;
import org.json.JSONException;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * Classe de DAO pour les produit
 * 
 * @author laurent
 * 
 */
public class ProductDAO extends DAO<Product> {

	/**
	 * Constructeur par défaut lançant la création de toutes les connexions
	 */
	public ProductDAO(Context context) {
		sqlHelper = new DbAdapter(context);
	}

	@Override
	public long create(Product obj) {
		// récupération d'un produit dans la base de données locale
		SQLiteDatabase db = sqlHelper.getWritableDatabase();

		ContentValues cv = new ContentValues();
		cv.put("productid", obj.getProductid());
		cv.put("description", obj.getDescription());
		cv.put("barcode", obj.getBarcode());
		cv.put("categoryid", obj.getCategoryid());
		long toReturn = db.insert("product", "", cv);

		db.close();
		return toReturn;
	}

	@Override
	public boolean delete(Product obj) {
		return true;
	}

	@Override
	public boolean update(Product obj) {
		return true;
	}

	@Override
	public Product find(int id) {
		Product toReturn = null;
		// récupération d'un produit dans la base de données locale
		SQLiteDatabase db = sqlHelper.getReadableDatabase();

		Cursor cursor = db.query("product", new String[] { "productid",
				"description", "barcode", "categoryid" }, "productid=?",
				new String[] { String.valueOf(id) }, null, null, null);
		if (cursor.moveToFirst()) {
			do {
				toReturn = new Product();
				toReturn.setProductid(cursor.getInt(0));
				toReturn.setDescription(cursor.getString(1));
				toReturn.setBarcode(cursor.getString(2));
				toReturn.setCategoryid(cursor.getInt(3));
			} while (cursor.moveToNext());
		}
		if (cursor != null && !cursor.isClosed()) {
			cursor.close();
		}
		db.close();
		return toReturn;
	}

	@Override
	public List<Product> findAll() {
		List<Product> toReturn = new ArrayList<Product>();
		// récupération d'un produit dans la base de données locale
		SQLiteDatabase db = sqlHelper.getReadableDatabase();

		Cursor cursor = db.query("product", new String[] { "productid",
				"description", "barcode", "categoryid" }, "", null, null, null,
				null);
		if (cursor.moveToFirst()) {
			do {
				Product p = new Product();
				p.setProductid(cursor.getInt(0));
				p.setDescription(cursor.getString(1));
				p.setBarcode(cursor.getString(2));
				p.setCategoryid(cursor.getInt(3));

				toReturn.add(p);
			} while (cursor.moveToNext());
		}
		if (cursor != null && !cursor.isClosed()) {
			cursor.close();
		}
		db.close();
		Collections.sort(toReturn);
		return toReturn;
	}

	@Override
	public void synchronise(Date lastupdate, Integer userId, Context context) {
		try {
			List<Product> products = WSClient.getInstance()
					.getProductsForSynchro(lastupdate);
			if (products != null) {
				for (Product p : products) {
					if (find(p.getProductid()) == null) {
						create(p);
					}
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// Méthode propre à un produitDAO
	// /////////////////////////////////////
	/**
	 * Récupération d'un produit via son barcode
	 * 
	 * @param barcode
	 *            Le code barre du produit à récupérer
	 * @return Le produit retrouver, null sinon
	 */
	public Product findByBarcode(String barcode) {
		Product toReturn = null;
		// récupération d'un produit dans la base de données locale
		SQLiteDatabase db = sqlHelper.getWritableDatabase();

		Cursor cursor = db.query("product", new String[] { "productid",
				"description", "barcode", "categoryid" }, "barcode=?",
				new String[] { barcode }, null, null, null);
		if (cursor.moveToFirst()) {
			do {
				toReturn = new Product();
				toReturn.setProductid(cursor.getInt(0));
				toReturn.setDescription(cursor.getString(1));
				toReturn.setBarcode(cursor.getString(2));
				toReturn.setCategoryid(cursor.getInt(3));
			} while (cursor.moveToNext());
		}
		if (cursor != null && !cursor.isClosed()) {
			cursor.close();
		}
		db.close();
		return toReturn;
	}

	public List<Product> getProductByCategory(Category c) {

		List<Product> toReturn = new ArrayList<Product>();
		// récupération d'un produit dans la base de données locale
		SQLiteDatabase db = sqlHelper.getReadableDatabase();

		Cursor cursor = db
				.query("product", new String[] { "productid", "description",
						"barcode", "categoryid" }, "categoryid=?",
						new String[] { c.getCategoryid().toString() }, null,
						null, null);
		if (cursor.moveToFirst()) {
			do {
				Product p = new Product();
				p.setProductid(cursor.getInt(0));
				p.setDescription(cursor.getString(1));
				p.setBarcode(cursor.getString(2));
				p.setCategoryid(cursor.getInt(3));

				toReturn.add(p);
			} while (cursor.moveToNext());
		}
		if (cursor != null && !cursor.isClosed()) {
			cursor.close();
		}
		db.close();
		Collections.sort(toReturn);
		return toReturn;
	}

	@Override
	public Product findByCommonId(String commonid) {
		// TODO Auto-generated method stub
		return null;
	}
}
